3T_Pandas Basic (3) - 데이터 그룹화 ( df.groupby )

  • Group by라는 기능. 그룹을 나눈다는 의미
    • df에서 관계있는 애들만 뽑아내는 작업
    • 번외로 중복되지 않은 값들을 뽑아내는 것까지

In [1]:
df = pd.DataFrame(columns=["시", "동"])
df


Out[1]:

In [5]:
df.loc[0] = ["서울", "신사동"]
df.loc[1] = ["서울", "대치동"]
df.loc[2] = ["서울", "봉천동"]

df.loc[3] = ["부산", "부산 1동"]
df.loc[4] = ["부산", "부산 2동"]

df.loc[5] = ["경북", "효자동"]
df.loc[6] = ["경북", "지곡동"]

In [6]:
df


Out[6]:
0 서울 신사동
1 서울 대치동
2 서울 봉천동
3 부산 부산 1동
4 부산 부산 2동
5 경북 효자동
6 경북 지곡동
  • 중복되지 않는 “시”의 리스트

In [10]:
df["시"]   #이거는 Series


Out[10]:
0    서울
1    서울
2    서울
3    부산
4    부산
5    경북
6    경북
Name: 시, dtype: object

In [11]:
list(df["시"])


Out[11]:
['서울', '서울', '서울', '부산', '부산', '경북', '경북']

In [12]:
set(list(df["시"]))


Out[12]:
{'경북', '부산', '서울'}

In [13]:
list(set(list(df["시"])))


Out[13]:
['서울', '경북', '부산']

In [15]:
#위의 과정을 압축하면
df["시"].unique()


Out[15]:
array(['서울', '부산', '경북'], dtype=object)
  • 각각의 df으로 만들고 싶다. (서울df, 부산df, 경북df)
  • for문을 돌리는 방법

In [24]:
city_name = "서울"
is_city = df["시"] == city_name  # 특정 True/False의 Series를 만들고
df[is_city]                      # 해당하는 row만 뽑는다.


Out[24]:
0 서울 신사동
1 서울 대치동
2 서울 봉천동

In [33]:
city_df_dict = {}

for city_name in df["시"].unique():
    is_city = df["시"] == city_name
    city_df = df[is_city]
    
    city_df_dict[city_name] = city_df

In [36]:
city_df_dict["부산"]   #Python의 자료형을 이용한 방법


Out[36]:
3 부산 부산 1동
4 부산 부산 2동

group by를 쓸 것이다

  • 위의 과정을 줄여준다.

In [38]:
df.groupby("시")


Out[38]:
<pandas.core.groupby.DataFrameGroupBy object at 0x000000000A8E2940>

In [39]:
city_groups = df.groupby("시")

In [42]:
city_groups.get_group("경북")


Out[42]:
5 경북 효자동
6 경북 지곡동